昨天把圖床講完,圖卡現在有網址了。今天開始碰 IG 本身,在發文之前要先搞定三件事:帳號是什麼類型、token 怎麼拿、token 過期怎麼辦。這三件事 references/ig-api.md 裡都有寫,順序是照實際跑過一次的順序,不是照官方文件抄的。
先講結論:個人帳號不能用官方 API 發文。Basic Display API 在 2024-12-04 停用之後,個人帳號就沒有任何官方路徑了,一定要先轉成 Professional 帳號。
Professional 又分 Creator 和 Business,兩種都能發文,差別在授權路徑。我整理成表:
| Creator | Business | |
|---|---|---|
| 需要綁 Facebook 粉專 | 否 | 是 |
| 授權路徑 | Instagram Login | Facebook Login |
| API host | graph.instagram.com |
graph.facebook.com |
| 發布權限 | instagram_business_content_publish |
instagram_content_publish |
我選 Creator,因為是個人品牌用途,而且 Creator 不用綁粉專,路徑短很多。轉換免費,隨時可以轉回個人帳號。步驟在手機 App 上:設定和隱私 → 帳號類型和工具 → 切換為專業帳號 → 選「創作者」。SKILL.md 有寫,這段要使用者自己做,AI 不要代勞。
config.example.yaml 的 instagram.api_base 預設就是 https://graph.instagram.com,註解寫了 Creator 走這個、Business 走 graph.facebook.com。選哪條路,等於決定了後面所有請求打去哪裡。
流程在 ig-api.md 的「取得 token」一節,一共八步。我挑幾個容易踩的講。
app 名稱有禁字。 在 developers.facebook.com 建 app 時,名稱不能含 ig、insta、gram、fb、face、book、rift,Meta 會當成冒用品牌擋下來。麻煩的是這些字常常藏在正常英文字裡,design、digital、config、light、right、program 全部中招。文件裡的安全範例是 carousel-publisher。
設定頁很難找。 新版介面把產品收進 use case 底下,左側選單沒有獨立的 Instagram 項目。use case 選「Manage messaging and content on Instagram」,進去之後才會出現「API 設定(使用 Instagram 登入)」。左側那個「商家專用 Facebook 登入」不要點,那是綁粉專的另一條路。
發布權限不用手動加。 權限頁面上 instagram_business_content_publish 旁邊有個「新增」按鈕,按下去通常會出錯,因為那是在申請 Advanced Access,需要商家驗證。實際上授權的時候,Meta 會把這個 use case 相關的權限一起發給 token,包含 content_publish。所以我直接跳過,最後用 debugger 確認 scope 就好。
一定要先把自己加成 Instagram 測試人員。 這是我寫文件時特別標上警告符號的一步,也是我在文件裡註明「官方文件和多數教學都漏掉」的那一步。沒做的話,授權視窗會回「開發人員角色不足」。
做法是:app 左側「應用程式角色 → 角色」,找「Instagram 測試人員」,注意不是「測試人員」,也不是「管理員」,那兩個是給 Facebook 帳號的。新增自己的 IG 帳號名稱送出邀請,再回到 Instagram,在「設定和隱私 → 網站許可 → 測試人員邀請」接受。邀請有時要等一兩分鐘才出現。
這之後才去 API 設定頁第 2 區塊按「新增帳號」,走完授權,token 就直接顯示。
app 不需要送審。 我的 app 照文件的建議,保持在「尚未發佈」。只要發文對象是 app 自己名冊上的帳號,development mode 就夠了。送 App Review 是給要開放第三方使用的 app,文件寫會花兩到四週,我完全用不到。
token 拿到不代表能用,所以文件裡有兩個驗證。第一個是打 /me:
curl -s "https://graph.instagram.com/v23.0/me?fields=id,username,account_type&access_token=$IG_ACCESS_TOKEN"
account_type 要是 MEDIA_CREATOR 或 BUSINESS。Creator 帳號在 API 裡的值是 MEDIA_CREATOR,不是 CREATOR,寫判斷式的時候要小心。如果是 PERSONAL,代表帳號還沒轉。回傳的 id 就是之後要用的 IG_USER_ID。
第二個是把 token 貼進 Meta 的 access token debugger,看範圍有沒有 instagram_business_content_publish、到期日是不是約兩個月後。
這兩件事 skill 裡用 ig_setup_check.py 包起來了。它會打 /me 檢查帳號類型,不是 CREATOR、BUSINESS、MEDIA_CREATOR 就印出說明並結束;IG_USER_ID 跟 token 對應的帳號不一致會提醒;再打 content_publishing_limit 查額度,印出像 0/100 這樣的數字,24 小時滾動視窗,輪播算一篇。後半段還會順便檢查圖床 repo、GITHUB_TOKEN、playwright 有沒有裝。SKILL.md 把它放在整體流程之前,第一次使用先跑一遍。
從文件實測看,這條路產出的直接就是長期 token,效期約 60 天,不需要再做 exchange。只有 debugger 顯示效期只有幾小時,才需要用 ig_exchange_token 把短期換成長期。
長期 token 可以續期,條件是 token 至少要滿 24 小時,續完重新計算 60 天。腳本是 refresh_token.py,核心就一個請求:
r = api_get(base, "refresh_access_token", {
"grant_type": "ig_refresh_token",
"access_token": token,
})
這是 graph.instagram.com 這條路的做法。腳本有判斷 api_base,要是走的是 Facebook Login,會改用 app id 和 secret 去換。我是 Creator,只會走到上面那段,Facebook 那一段我沒有驗證過。
續完腳本會做三件事:算出剩幾天印出來、把新 token 寫到 ~/.config/ig-carousel/token、把權限設成 0o600(只有自己讀得到)。最後提醒我在 shell profile 裡改成:
export IG_ACCESS_TOKEN="$(cat ~/.config/ig-carousel/token)"
這樣以後續期只會改那個檔案,profile 不用再動。
文件建議在機器上排一個每 30 天跑一次的 cron 或 launchd job,理由是比記得手動續可靠。60 天一次的事,人一定會忘。這個建議我寫在文件裡,不過腳本本身不會幫你排程,要自己設。
要是真的忘了,過期就得整個授權流程重來。錯誤排查表裡,OAuthException code 190 就是 token 過期或無效:沒超過 60 天跑 refresh_token.py,超過了就重跑授權。
整條路最大的代價是設定很繁瑣,而且一半在 Meta 的後台介面,介面會改,今天寫的選單名稱幾個月後可能就不一樣。所以我把步驟寫在 ig-api.md 裡,照實際操作的順序,卡住的時候 AI 讀得到。
另一個取捨是,development mode 加測試人員的做法,只能發自己名冊上的帳號。對我這個「只發自己帳號」的用途剛好,要做給別人用的服務就不行了,那要走審核。
還有一件事跟 Day 25 有關:token 是我自己去 Meta 後台拿的,SKILL.md 明寫不要代替使用者輸入帳號密碼或申請 token。AI 的角色是把步驟講清楚、卡住時幫忙除錯,授權那一步一定是我本人點的。
這一步要解決的是 AI 拿什麼身份去打 IG:帳號要轉 Professional,我選 Creator;token 要先把自己加成 Instagram 測試人員才拿得到;拿到之後用 ig_setup_check.py 驗證帳號類型和額度;效期約 60 天,用 refresh_token.py 續,最好排程。
明天講發布本身:三段式建立貼文、取回 permalink,以及發完之後怎麼清理圖床。